package com.keitaitoys.fonteditor.core;

import java.io.File;

import javax.swing.event.EventListenerList;

import com.keitaitoys.fonteditor.event.FontManagerChangeEvent;
import com.keitaitoys.fonteditor.event.FontManagerChangeListener;
import com.keitaitoys.fonteditor.event.FontManagerChangeEvent.FontManagerChangeType;
import com.keitaitoys.fonteditor.font.Font;
import com.keitaitoys.fonteditor.io.FontReader;
import com.keitaitoys.fonteditor.io.FontWriter;

public class FontManager {

	//////////////////////////////////////////////////////////////////////
	// Description ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Consts ////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Variables /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private static FontManager manager;

	protected EventListenerList listenerList = new EventListenerList();

	private Font font;
	private File file;
	
	private FontReader fontReader;
	private FontWriter fontWriter;
	
	private boolean dirty;
	
	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private FontManager() {
		
		init();
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////
	
	private void init() {
		
		font = new Font();
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////
	
	public static synchronized FontManager getInstance() {
		
		if(manager == null) {
			manager = new FontManager();
		}
		
		return manager;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public Font getFont() {
		
		return font;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public void setFont(Font font) {
		
		this.font = font;
		
		fireFontManagerChanged(FontManagerChangeType.FONT_CHANGED);
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public File getFile() {
		
		return file;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public FontReader getFontReader() {
		
		return fontReader;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public FontWriter getFontWriter() {
		
		return fontWriter;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public void setFile(File file) {
		
		this.file = file;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public void setFontReader(FontReader fontReader) {
		
		this.fontReader = fontReader;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public void setFontWriter(FontWriter fontWriter) {
		
		this.fontWriter = fontWriter;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public boolean isDirty() {
		
		return dirty;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

	public void setDirty(boolean dirty) {
		
		this.dirty = dirty;
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////

    protected void fireFontManagerChanged(FontManagerChangeType type) {
    	
    	Object[] listeners = listenerList.getListenerList();
    	FontManagerChangeEvent e = null;

    	for(int i = listeners.length - 2; i >= 0; i -= 2) {
    		
    	    if(listeners[i] == FontManagerChangeListener.class) {
    	    	if(e == null) e = new FontManagerChangeEvent(this, type);
    	    	((FontManagerChangeListener)listeners[i + 1]).fontManagerChange(e);
    	    }
    	}
    }

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public void addFontManagerChangeListener(FontManagerChangeListener l) {
		
		listenerList.add(FontManagerChangeListener.class, l);
    }

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public void removeFontManagerChangeListener(FontManagerChangeListener l) {
		
		listenerList.remove(FontManagerChangeListener.class, l);
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public FontManagerChangeListener[] getFontManagerChangeListeners() {
		
		return (FontManagerChangeListener[])listenerList.getListeners(FontManagerChangeListener.class);
	}
}